/* 
 * File:   Partida.h
 * Author: fibrizo
 *
 * Created on 24 de mayo de 2014, 17:45
 */

#ifndef PARTIDA_H
#define	PARTIDA_H

#include "server_Jugador.h"
#include "server_Campania.h"
#include "server_Evento.h"
#include "server_Nivel.h"
#include "server_ColaDeEventos.h"
#include <queue>
#include <map>
#include <unordered_set>
#include <string>
#include <unordered_map>
using std::map;
using std::string;
using std::queue;
using std::unordered_set;
using std::unordered_map;
typedef struct vector<Nivel> vectorN;
typedef struct map<string, Jugador*> hash; //nombre:jugador.

class Partida {
private:
    string nombre;
    ColaDeEventos* colaDeEventos;    
    unsigned int cantidadJugadoresActual;
    unsigned int cantidadJugadoresRequerida;
    hash jugadores;
    string tileMapInicial;
    Campania campania;
    Nivel nivelActual;
    unordered_set<string> noDisponibles;
    string codigos;
    bool terminada;
    bool cancelada;
    bool lista;
    bool iniciar;
    bool Jugando;
    bool campaniaCargada;
    bool empezar;
    size_t alcanceBombas;
    float tiempoDetonacion;
    // Otros tiempos
    float tiempRefresco;
    float tiempoRegerenacionBomba;
    // Velocidades de desplazamiento
    float tiempoZombieVerde;
    float tiempoBomberman;
    float tiempoDisparo;
    // Mapa
    size_t tamanioMapa;
    vectorN crearNiveles(vector<string> datos);
public:
    //Constructores
    Partida();
    Partida(Jugador* host);
    Partida(Jugador* host, string rutaArchivoCampania);
    Partida(const Partida& orig);
    //Metodos
    void agregarJugador(Jugador* nuevoJugador);
    void eliminarJugador(Jugador* jugador);
    bool jugadoresListos();
    bool estaListaParaComenzar();
    bool cargarCampania(string rutaArchivoCampania);
    bool cargarDatosDeConfiguracion(string rutaArchivoConfiguracion);
    void actualizarEstado();
    bool nivelActualTerminado();
    bool correr();
    Campania obtenerCampania();
    string getTileMap();
    string getTileMapInicial();
    ColaDeEventos* getColaDeEventos();
    void setNombre(string nombre);
    string getNombre();
    unsigned int getCantJugadoresRequerida();
    unsigned int getCantJugadoresActual();
    void setFlagIniciar();
    void setFlagEmpezar();
    void cancelar();
    bool fueCancelada();
    bool estaJugando();
    bool empezarActivado();
    unordered_map<string,string> elegirSerialParaJugador();
    unordered_map<string,string> elegirSerialParaHost();
    //Destructor
    virtual ~Partida();
};

#endif	/* PARTIDA_H */

